package cn.suchan.jianzhi.q19_matrix;

import java.util.ArrayList;

/**
 * 知识点：顺时针打印矩阵
 * 题目描述
 * 输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字，
 * 例如，如果输入如下4 * 4矩阵： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
 * 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
 *
 * @author suchan
 * @date 2019/05/27
 */
public class Solution {

    public ArrayList<Integer> printMatrix(int[][] matrix) {
        ArrayList resultList = new ArrayList();

        // 矩阵行数
        int rows = matrix.length;
        // 矩阵列数
        int cols = matrix[0].length;

        // 从(0,0)开始循环,圈数：start=0第一圈，start=1第二圈...以此类推
        int start = 0;

        // 让循环继续的条件是当前行数大于该圈循环开始的行数的两倍
        // 以及当前列数大于该圈循环开始的列数的两倍（每圈循环开始的行数、列数相同）
        while (rows > start * 2 && cols > start * 2) {
            // 每一圈最后一行下标
            int endRow = rows - 1 - start;
            // 每一圈最后一列下标
            int endColumn = cols - 1 - start;
            // 开始一圈圈打印，每打印一圈分为四步，从左到右、从上到下、从右到左、从下到上
            // 从左到右，第一步一定会走
            for (int i = start; i <= endColumn; i++) {
                resultList.add(matrix[start][i]);
            }
            // 从上到下，最后一行大于开始行
            if (endRow > start) {
                for (int i = start + 1; i <= endRow; i++) {
                    resultList.add(matrix[i][endColumn]);
                }
            }
            // 从右到左，最后一行大于开始行，最后一列大于开始列
            if (endRow > start && endColumn > start) {
                for (int i = endColumn - 1; i >= start; i--) {
                    resultList.add(matrix[endRow][i]);
                }
            }
            // 从下到上,至少是三行两列，也就是最后一行大于开始行加2，最后一列大于开始列
            if (endRow >= start + 2 && endColumn > start) {
                for (int i = endRow - 1; i > start; i--) {
                    resultList.add(matrix[i][start]);
                }
            }
            // 继续打印下一圈
            start++;
        }
        return resultList;
    }

    public static void main(String[] args) {
        int[][] matrix = {
                {1, 2, 3, 4, 5},
                {6, 7, 8, 9, 10},
                {11, 12, 13, 14, 15},
                {16, 17, 18, 19, 20}
        };

        Solution solution = new Solution();
        ArrayList<Integer> matrixList = solution.printMatrix(matrix);

        for (Integer m : matrixList) {
            System.out.println(m);
        }
    }
}
